package org.example.mapper;

import org.apache.ibatis.annotations.Param;
import org.example.datasource.TargetDataSource;
import org.example.domain.Student;
import org.example.domain.StudentProcessed;

import java.util.List;
import java.util.Map;

/**
 * MyBatis映射器 - 学生处理数据映射
 * 
 * 🎯 功能说明：
 * 定义学生数据处理相关的数据库操作，支持Spring Batch集成
 * 
 * 🛠️ 主要方法：
 * 1. batchInsert: 批量插入处理结果（用于Spring Batch Writer）
 * 2. selectStudentsForBatch: 分页查询学生数据（用于Spring Batch Reader）
 * 3. selectProcessStatistics: 统计查询处理结果
 * 4. selectByBatchNumber: 根据批次号查询处理结果
 * 
 * 📊 Spring Batch集成：
 * - 读取器：selectStudentsForBatch方法配合MyBatisPagingItemReader
 * - 写入器：batchInsert方法配合自定义ItemWriter
 * - 监控：selectProcessStatistics方法用于任务完成后的统计分析
 * 
 * 🔧 技术特点：
 * - 使用@TargetDataSource注解指定数据源
 * - 支持动态SQL查询条件
 * - 批量操作优化性能
 * - 结果集自动映射
 * 
 * @author Spring Batch + MyBatis Demo
 */
@TargetDataSource("physicalMaster")  // 指定使用主数据源
public interface StudentProcessedMapper {
    
    /**
     * 插入单条记录
     */
    int insert(StudentProcessed record);
    
    /**
     * 选择性插入（只插入非空字段）
     */
    int insertSelective(StudentProcessed record);
    
    /**
     * 批量插入记录（MyBatis批处理）
     * 用于Spring Batch的ItemWriter
     */
    int batchInsert(@Param("list") List<StudentProcessed> records);
    
    /**
     * 根据主键查询
     */
    StudentProcessed selectByPrimaryKey(Long id);
    
    /**
     * 根据原始学生ID查询
     */
    List<StudentProcessed> selectBySourceStudentId(Integer sourceStudentId);
    
    /**
     * 根据批次号查询
     */
    List<StudentProcessed> selectByBatchNumber(String batchNumber);
    
    /**
     * 分页查询学生数据（用于Spring Batch的MyBatisPagingItemReader）
     * Spring Batch会自动添加分页参数
     */
    List<Student> selectStudentsForBatch(Map<String, Object> params);
    
    /**
     * 统计总记录数
     */
    long countTotal();
    
    /**
     * 根据条件统计记录数
     */
    long countByCondition(@Param("processStatus") String processStatus);
    
    /**
     * 根据主键删除
     */
    int deleteByPrimaryKey(Long id);
    
    /**
     * 根据批次号删除
     */
    int deleteByBatchNumber(String batchNumber);
    
    /**
     * 更新记录
     */
    int updateByPrimaryKey(StudentProcessed record);
    
    /**
     * 选择性更新
     */
    int updateByPrimaryKeySelective(StudentProcessed record);
    
    /**
     * 查询处理统计信息
     */
    Map<String, Object> selectProcessStatistics(@Param("batchNumber") String batchNumber);
} 